/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import pojos.Descargas;
import pojos.Pedido;
import pojos.Usuario;

/**
 *
 * @author Miguel
 */
public class Servicio {
    //Campo SimpleDateFormat preparado para usarse en varios hilos,
	//cada uno usara su propia instancia
    private static ThreadLocal<SimpleDateFormat> tsdf=new ThreadLocal<SimpleDateFormat>();
    public static SimpleDateFormat getSdf() {
    	if(tsdf.get()==null) {
    		tsdf.set(new SimpleDateFormat("yyyy-MM-dd"));
    	}        
        return tsdf.get();
    }
    //Configuracion de conecitividad de la App
    public static String getHost() {
    	//return "172.16.205.2";//Este valor se cambiara segun la IP del servidor
    	//return "172.16.205.1";//Este valor se cambiara segun la IP del servidor
    	//return "192.168.1.11";
    	return "192.168.1.7";
    }
    
    public static int getPuerto() {
    	return 8080;//Este debera cambiarse por el puerto que usa el servidor
    }
    
    public static int getPuertoArch() {
    	return 27888;
    }
    
    //Peticiones 
    public static Peticion getProdDestacados() {
    	
    	String today=getSdf().format(new Date());
    	Calendar inicio=new GregorianCalendar();
    	inicio.add(Calendar.DAY_OF_MONTH, -10);
    	String inicioStr=getSdf().format(inicio.getTime());
    	Query consulta = new Query(Query.PRODUCTO_ARRAY, new String[]{"*"},
    			new String[]{"producto"}, "prod_fecha_alta BETWEEN ? AND ?", new String[]{inicioStr, today});
    	consulta.setOrderBy("prod_fecha_alta DESC");    	
		return new Peticion(Peticion.TIPO_SELECT, consulta);
    }
    
    public static Peticion getproductosMasDes() {
    	Query q=new Query(Query.PRODUCTO_ARRAY, false, new String[]{"p.*"}, new String[]{"producto p", "descargas d"}, 
    			new String[]{"p.id=d.desc_producto"}, null, null, "p.id",null,
    			"count(DISTINCT d.id) DESC",null);
    	q.setJoinModifiers(new String[]{"LEFT"});
    	return new Peticion(Peticion.TIPO_SELECT, q);
    }
    
    public static Peticion getProdMasVen() {
    	/*q=new Query(tipoRetorno, distinct, columns, tables, 
    	 * joinConditions, selection, selectionArgs,
    	 *  groupBy, having, orderBy, limit)*/
    	Query q=new Query(Query.PRODUCTO_ARRAY, false, new String[]{"p.*"}, new String[]{"producto p", "descargas d"}, 
    			new String[]{"p.id=d.desc_producto"}, "p.prod_precio>0", null, "p.id","count(DISTINCT d.id)>0",
    			"count(DISTINCT d.id) DESC",null);
    	q.setJoinModifiers(new String[]{"LEFT"});
    	
    	System.out.println("SQL Prod mas Vendidos: "+q.obtenerSQL());
    	
    	return new Peticion(Peticion.TIPO_SELECT, q);
    }
    
    public static Peticion getProductosTopGratis() {
    	Query q=new Query(Query.PRODUCTO_ARRAY, false, new String[]{"p.*"}, new String[]{"producto p", "descargas d"}, 
    			new String[]{"p.id=d.desc_producto"}, "p.prod_precio=0", null, "p.id", null,
    			"count(DISTINCT d.id) DESC",null);
    	q.setJoinModifiers(new String[]{"LEFT"});
    	return new Peticion(Peticion.TIPO_SELECT, q);
    }
    
    public static Peticion getLogin(String usuario, String passwd) {
    	return new Peticion(Peticion.TIPO_SELECT, new Query(Query.USUARIO_ARRAY, new String[]{"*"},
    			new String[]{"usuario"},"usu_login=? AND usu_passwd=sha1(?)",new String[]{usuario, passwd}));
    }
    
    public static Peticion getProductosAdquiridos(int idUsuario, String limit) {
    	Query consulta=new Query(Query.PRODUCTO_ARRAY, new String[]{"p.*"},
    			new String[]{"producto p","descargas d","pedido ped","usuario u"},//Tablas
    			new String[]{"p.id=d.desc_producto","d.desc_pedido=ped.id","ped.ped_usuario=u.id"},//Join Cond.
    			"u.id=?", new String[]{idUsuario+""});
    	consulta.setOrderBy("d.desc_fecha DESC");
    	if(limit!=null) {
    		consulta.setLimit(limit);
    	}
    	return new Peticion(Peticion.TIPO_SELECT, consulta);
    }
    
    public static Peticion getProductosEnVenta(int idUsuario, String limit) {
		Query consulta=new Query(Query.PRODUCTO_ARRAY, new String[]{"*"}, new String[]{"producto"});
		consulta.setSelection("prod_vendedor=?");
		consulta.setSelectionArgs(new String[]{idUsuario+""});
		consulta.setOrderBy("prod_fecha_alta DESC");
		if(limit!=null) {
			consulta.setLimit(limit);
		}
		return new Peticion(Peticion.TIPO_SELECT, consulta);
	}
    
    public static Peticion getProdDetalle(int prodId) {		
		return new Peticion(Peticion.TIPO_SELECT, new Query(Query.PRODUCTODETALLE_ARRAY, new String[]{"*"},
				new String[]{"producto_detalle"}, "id=?", new String[]{""+prodId}));
	}
	public static Peticion getCategorias() {
		
		return new Peticion(Peticion.TIPO_SELECT, new Query(Query.TIPOPRODUCTO_ARRAY,
				new String[]{"*"}, new String[]{"tipo_producto"}));
		
	}
	
	public static Peticion getSubcategorias(int tipoProdId) {		
		return new Peticion(Peticion.TIPO_SELECT, new Query(Query.CATEGORIA_ARRAY, new String[]{"c.*"},
				new String[]{"tipo_producto tp", "tprod_categoria tpc","categoria c"},
				new String[]{"tp.id=tpc.tipo_producto_id","tpc.categoria_id=c.id"}, "tp.id=?",
				new String[]{tipoProdId+""}));
	}
	
	public static Peticion getBusquedaAvanzada(int tProdId, int catId, String orderBy) {
		Query consulta=new Query(Query.PRODUCTO_ARRAY, new String[]{"p.*"},
				new String[]{"producto p","tipo_producto tp","producto_categoria pcat" ,"categoria c"},
				new String[]{"p.prod_tipo_producto=tp.id","p.id=pcat.producto_id","pcat.categoria_id=c.id"},
				"tp.id=? AND c.id=?", new String[]{""+tProdId,""+catId});
		consulta.setOrderBy(orderBy);
		return new Peticion(Peticion.TIPO_SELECT, consulta);
	}
	
	public static Peticion getInsertarPedido(int idUsuario) {		
		return new Peticion(Peticion.TIPO_MODIFICAR, 
				Query.PEDIDO_ARRAY, new Pedido(idUsuario, Pedido.EN_CARRITO));
	}
    
	public static Peticion getPedido(int idUsuario) {
			//Obtenemos el pedido que todavia esta sin confirmar de ese usuario
		return new Peticion(Peticion.TIPO_SELECT, new Query(Query.PEDIDO_ARRAY,
				new String[]{"*"}, new String[]{"pedido"},"ped_estado=?",new String[]{Pedido.EN_CARRITO}));
	}
	
	public static Peticion getInsertarDescarga(int idPed, int idProd,
			double prod_precio) {
		Descargas d=new Descargas(idPed, idProd, "", new Date(), prod_precio, 0.0, null);
		return new Peticion(Peticion.TIPO_MODIFICAR, Query.DESCARGA_ARRAY, d);
	}
	
	public static Peticion getActualizarPed(Pedido ped) {		
		return new Peticion(Peticion.TIPO_MODIFICAR, Query.PEDIDO_ARRAY, ped);
	}
	
	public static Peticion getActualizarUsuario(Usuario usu) {		
		return new Peticion(Peticion.TIPO_MODIFICAR, Query.USUARIO_ARRAY, usu);
	}
	
    //Comandos para solicitar archivos al servidor    
    public static String getCmdDescargarPortada(int idProducto) {
    	return "GET /digitalify/res/images/"+idProducto+".png";
    }
    public static String getCmdDescargarProducto(int idProducto) {
    	return "GET /digitalify/products/"+idProducto;
    }
}
